﻿/**
 * Create in 2012-4-5.
 */
package kit4j.common.event;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 抽象事件发送者实现。实现了事件发送者的一些默认操作(如事件监听器管理)，方便开发者创建时间发送者实现。
 * 
 * @author MiniKnife
 * 
 */
public abstract class AbstractEventFirer<L, E> implements EventFirer<L, E> {

	/**
	 * 事件监听器集合。
	 */
	protected Set<L> listenerSet;

	/**
	 * 创建一个事件发送者。
	 */
	public AbstractEventFirer() {
		listenerSet = new HashSet<L>();
	}

	/**
	 * @see kit4j.common.event.EventFirer#addListener(java.lang.Object)
	 */
	@Override
	public void addListener(L listener) {
		listenerSet.add(listener);
	}

	/**
	 * @see kit4j.common.event.EventFirer#removeListener(java.lang.Object)
	 */
	@Override
	public void removeListener(L listener) {
		listenerSet.remove(listener);
	}

	/**
	 * @see kit4j.common.event.EventFirer#fireEvent(java.lang.Object)
	 */
	@Override
	public void fireEvent(final E evt) {
		List<L> list = new ArrayList<L>(listenerSet);
		
		for (L listener : list) {
			fireEventToListener(evt, listener);
		}
	}

	/**
	 * 发送事件到指定的事件监听器。
	 * 
	 * @param evt
	 *            要发送的事件
	 * @param listener
	 *            要接收事件的监听器
	 */
	abstract protected void fireEventToListener(E evt, L listener);

}
